# 【问题描述)
# 给定一个n*n的棋盘，棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后，使任意的两个黑皇后都不在同一行、同一列或同一条对角线上，任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8.
# 【输入格式】
# 输入的第一行为一个整数n，表示棋盘的大小。
# 接下来n行，每行n个0或1的整数，如果一个整数为1，表示对应的位置可以放皇后，如果一个整数为0，表示对应的位置不可以放皇后
# 输出格式)
# 输出一个整数，表示总共有多少种放
# 法。
# 【样例输入1】
# 4
# 1 1 1 1
# 1 1 1 1
# 1 1 1 1
# 1 1 1 1
# 【样例输出1】
# 2
# 【样例输入2】
# 4
# 1 0 1 1
# 1 1 1 1
# 1 1 1 1
# 1 1 1 1
# 【样例输出2】
# 0

# 方法1:dfs深度优先搜索

# 方法2:回溯法

def correctWhite(tmpWhite, row):
    if arr[row][tmpWhite[row]] == 1:  # tmpWhite[row]表示第几列 ,如果此位置是1, 则表示可以放置
        for i in range(row):  # 判断条件为不在同一列,和不在同一对角线上
            if abs(tmpWhite[i] - tmpWhite[row]) == abs(i - row) or tmpWhite[i] == tmpWhite[row]:
                return False
        return True


def correctBlack(tmpBlack, row, tmpWhite):
    if arr[row][tmpBlack[row]] == 1 and tmpBlack[row] != tmpWhite[
        row]:  # tmpBlack[row]表示第几列 ,如果此位置是1和此位置不和白皇后冲突, 则表示可以放置
        for i in range(row):  # 判断条件为不在同一列,和不在同一对角线上
            if abs(tmpBlack[i] - tmpBlack[row]) == abs(i - row) or tmpBlack[i] == tmpBlack[row]:
                return False
        return True


def dfs_Black(tmpBlack, row):
    if row == n:  # 此时黑皇后和白皇后的位置全部确定, 将结果输入到ans列表中
        ans.append(tmpBlack[:])
        return  # 退出递归
    else:
        for col in range(n):
            tmpBlack[row] = col
            if correctBlack(tmpBlack, row, tmpWhite):  # 如果位置合法
                dfs_Black(tmpBlack, row + 1)  # 开始下一个黑皇后的放置


def dfs_White(tmpWhite, row):
    if row == n:  # 如果此时确定了白皇后的全部位置,开始放置黑皇后
        dfs_Black(tmpBlack, 0)
    else:
        for col in range(n):  # 从第一个白皇后开始放置
            tmpWhite[row] = col
            if correctWhite(tmpWhite, row):  # 如果位置可以放置
                dfs_White(tmpWhite, row + 1)  # 开始放置下一个白皇后


# 先在条件合法的情况下放置白皇后，并且将白皇后暂时存储在tmpWhite数组中。然后在白皇后全部放置的基础上，开始放置黑皇后
if __name__ == '__main__':
    # 输入n与棋盘, 其中棋盘用二维数组表示
    n = int(input())
    arr = [list(map(int, input().split())) for _ in range(n)]
    # 设置临时存放黑白皇后的棋盘
    tmpWhite = [None for _ in range(n)]
    tmpBlack = [None for _ in range(n)]
    ans = []
    # 先从白皇后放置开始
    dfs_White(tmpWhite, 0)
    print(len(ans))
